<?php
  /**
   * @author EVANDRO DE OLIVEIRA.
   * @category MODEL
   * @package MODELS.
   * @since 05/05/2012.
   * @last_update 05/05/2012.
   * @copyright 2012.
   * @version 1.0.
   *
   */
  class Application_Model_Alunos extends Zend_Db_Table_Abstract{
    const IND_ATIVO = 1;
    const IND_INATIVO = 0;
    
    /**
     * Define a tabela padrão da controller
     */
    protected function _setup(){
      $this->_name = 'alunos';
      parent::_setup();
    }
    
    /**
     * Retorna a string SELECT como todos os campos solicitados por parametro.
     * @param array Array com as opções de colunas e clausulá WHERE.
     *              Ex: Colunas:
     *                  $arrOptions['fields_perfil'] = array('campo1', 'campo2', 'campoN').
     *                  
     *                  WHERE
     *                    $arrOptions['where_clause'] = array('ds_peril' => 'usuario')
     * @param string  Comparação.Ex: =, LIKE NOT LIKE, etc  
     *                    
     * @return string                   
     */
    public function _get($arrOptions = array(), $strComparison = '='){
      $arrAlias     = array('a' => $this->_name);
      
      if(isset($arrOptions['fields']))
        $arrCols = $arrOptions['fields'];
      else
        $arrCols = array('a.*');
          
      $strSql = $this->getAdapter()
      ->select()
      ->from($arrAlias, $arrCols)
      ->where('a.ds_situacao = ?', self::IND_ATIVO);
      
      if(isset($arrOptions['where_clause']))
        foreach($arrOptions['where_clause'] as $strkey => $strValue)
          $strSql->where($strkey . $strComparison . ' ?', $strValue);  
          
      $strSql->order('a.idAluno');
      
      return $strSql;
    }
    
    /**
     * Retorna o registro
     * 
     * @param integer Id do registro
     * @return database_result
     */
    public function get($intId = null){
      if($intId == null)
        return false;
      
      $arrOptions['fields'] = array(
        'a.idAluno',
        'a.idTurma',
        'a.idEstadoCivil',
        'a.idCidade',
        'a.idProfissao',
        'a.ds_matricula',
        'a.ds_nome',
        'a.ds_cpf',
        'a.ds_rg',
        'a.ds_sexo',
        'a.dt_nascimento',
        'a.ds_endereco',
        'a.nr_residencia',
        'a.ds_complemento',
        'a.ds_cep',
        'a.ds_bairro',
        'a.ds_email',
        'a.ds_fone',
        'a.ds_cel',
        'a.ds_mae',
        'a.ds_pai',
        'a.ds_responsavel',
        'a.idIndicacao',
        'a.dt_insercao',
        'a.dt_atualizacao',
        'a.idFuncionario',
        'a.ds_situacao',
      );
      
      $arrOptions['where_clause'] = array(
        'a.idAluno'  => $intId   
      );
      
      $strSql = $this->_get($arrOptions);  
        
      $objResult = $this->getAdapter()->fetchAll($strSql);
        
      return Core_Commons::onLoad($objResult);
    }
    
    public function getFullById($intIdAluno){
    	if($intIdAluno == null)
        return false;
      
      $arrOptions['fields'] = array(
        'a.idAluno',
        'a.idTurma',
        'a.idEstadoCivil',
        'a.idCidade',
        'a.idProfissao',
        'a.ds_matricula',
        'a.ds_nome',
        'a.ds_cpf',
        'a.ds_rg',
        'a.ds_sexo',
        'a.dt_nascimento',
        'a.ds_endereco',
        'a.nr_residencia',
        'a.ds_complemento',
        'a.ds_cep',
        'a.ds_bairro',
        'a.ds_email',
        'a.ds_fone',
        'a.ds_cel',
        'a.ds_mae',
        'a.ds_pai',
        'a.ds_responsavel',
        'a.idIndicacao',
        'a.dt_insercao',
        'a.dt_atualizacao',
        'a.idFuncionario',
        'a.ds_situacao',
        'a.st_contrato',
        'idIndicacao' => 'aa.idAluno',
        'ds_indicacao' => 'aa.ds_nome',
        'c.ds_cidade',
        'cs.idCurso',
        'cs.ds_curso',
        'e.ds_sigla',
        'e.ds_estado',
        'e.idEstado',
        'ec.ds_estado_civil',
        'm.idModulo',
        'm.ds_modulo',
        'p.ds_profissao',
        'pr.nr_valor_final',
        't.ds_turma',
      );
      
      $arrOptions['where_clause'] = array(
        'a.idAluno'  => $intIdAluno   
      );
      
      $strSql = $this->_get($arrOptions)
      ->join(array('t' => 'turmas'), 't.idTurma = a.idTurma', array())
      ->join(array('mt' => 'modulos_turmas'), 'mt.idTurma = t.idTurma', array())
      ->join(array('m' => 'modulos'), 'm.idModulo = mt.idModulo', array())
      ->join(array('cs' => 'cursos'), 'cs.idCurso = m.idCurso', array())
      ->join(array('pr' => 'precos'), 'pr.idPreco = m.idPreco', array())
      ->join(array('ec' => 'estado_civil'), 'ec.idEstadoCivil = a.idEstadoCivil', array())
      ->join(array('c' => 'cidades'), 'c.idCidade = a.idCidade', array())
      ->join(array('e' => 'estados'), 'e.idEstado = c.idEstado', array())
      ->join(array('p' => 'profissoes'), 'p.idProfissao = a.idProfissao', array()) 
      ->joinLeft(array('aa' => 'alunos'), 'aa.idAluno = a.idIndicacao', array());  
      
      $objResult = $this->getAdapter()->fetchRow($strSql);
        
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Retorna todos os registros ativos.
     * 
     * @return array
     */
    public function getAtivos(){
      $strSql = $this->select()->where($this->_name . '.ds_situacao = ?', self::IND_ATIVO);
      
      $objResult = $this->fetchAll($strSql);
            
      return Core_Commons::onLoad($objResult);
    }
    
    public function getPrecoByIdAluno($intIdAluno = null){
    	if($intIdAluno == null)
        return false;
        
      $arrOptions['fields'] = array(
        'a.idAluno',
        'm.idModulo', 
        'm.ds_modulo', 
        'm.nr_carga_horaria_modulo',
        'p.nr_valor_final',
      );
      
      $arrOptions['where_clause'] = array(
        'a.idAluno'  => $intIdAluno   
      );
      
      $strSql = $this->_get($arrOptions)
      ->join(array('t' => 'turmas'), 't.idTurma = a.idTurma', array())
      ->join(array('mt' => 'modulos_turmas'), 'mt.idTurma = t.idTurma', array())
      ->join(array('m' => 'modulos'), 'm.idModulo = mt.idModulo', array())
      ->join(array('p' => 'precos'), 'p.idPreco = m.idPreco', array());

      $objResult = $this->getAdapter()->fetchRow($strSql);
        
      return Core_Commons::onLoad($objResult);
    }
    
  /**
     * Retorna o resultado de acordo com o nome. 
     * 
     * @param string  Nome do menu
     * @param string  Nome da controller
     * 
     * @return database_result
     */
    public function getByNomeEMatricula($strDs, $strDs2){  
      $arrOptions['fields'] = array(
        'a.idAluno',
        'a.ds_matricula',
        'a.ds_nome',
        'c.idCurso',
        'c.ds_curso',
        'm.idModulo',
        'm.ds_modulo',
        't.idTurma',
        't.ds_turma'   
      );
      
      if($strDs && $strDs2){ 
        $arrOptions['where_clause'] = array(
          'a.ds_matricula'  => '%' . $strDs . '%', 
          'a.ds_nome' => '%' . $strDs2 . '%'      
        );   
        
        $strComparison = ' LIKE ';
      }  
      elseif($strDs && !$strDs2){ 
        $arrOptions['where_clause'] = array(
          'a.ds_matricula'  => '%' . $strDs . '%'
        );
        
        $strComparison = ' LIKE ';
      }  
      elseif(!$strDs && $strDs2){ 
        $arrOptions['where_clause'] = array(
          'a.ds_nome' => '%' . $strDs2 . '%'      
        );
        
        $strComparison = ' LIKE ';
      }  
      else{
        $arrOptions['where_clause'] = array(
          1  => 1, 
        );
        
        $strComparison = ' = ';
      }
      
      $strSql = $this->_get($arrOptions, $strComparison)
      ->join(array('t' => 'turmas'), 't.idTurma = a.idTurma', array())
      ->join(array('mt' => 'modulos_turmas'), 'mt.idTurma = t.idTurma', array())
      ->join(array('m' => 'modulos'), 'm.idModulo = mt.idModulo', array())
      ->join(array('c' => 'cursos'), 'c.idCurso = m.idCurso', array())
      ;
      //$objResult = $this->getAdapter()->fetchAll($strSql);            
      //return Core_Commons::onLoad($objResult);
      return $strSql;
    }

    /**
     * Validação do formulário de Dados Pessoais.
     * 
     * @return object
     */
    public function validaFormDadosPessoais(){
    	$objValida = new Core_ValidaFormulario();
    	$arrFilters = array('*'  =>  'StringTrim');
    	$arrOptions = array('allowEmpty' =>  true);
    	
    	$arrValidators = array(
        'Número de Matrícula' =>  array('allowEmpty'  => false, 'fields' => 'ds_matricula'),
        'Nome'                =>  array('allowEmpty'  => false, 'fields' => 'ds_nome'),
        'Sexo'                =>  array('allowEmpty'  => false, 'fields' => 'ds_sexo'),
        'Estado Civil'        =>  array('allowEmpty'  => false, 'fields' => 'idEstadoCivil'),
        'Data de Nascimento'  =>  array('allowEmpty'  => false, 'fields' => 'dt_nascimento'),
        'Endereço'            =>  array('allowEmpty'  => false, 'fields' => 'ds_endereco'),
        'Número'              =>  array('allowEmpty'  => false, 'fields' => 'nr_residencia'),
        'Complemento'         =>  array('allowEmpty'  => true,  'fields' => 'ds_complemento'),
        'CEP'                 =>  array('allowEmpty'  => false, 'fields' => 'ds_cep'),
        'Bairro'              =>  array('allowEmpty'  => false, 'fields' => 'ds_bairro'),
        'Estado'              =>  array('allowEmpty'  => false, 'fields' => 'idEstado'),
        'Cidade'              =>  array('allowEmpty'  => false, 'fields' => 'idCidade'),
        'Telefone Residêncial'=>  array('allowEmpty'  => true,  'fields' => 'ds_fone'),
        'Telefone Celular'    =>  array('allowEmpty'  => true,  'fields' => 'ds_cel'),
        'CPF'                 =>  array('allowEmpty'  => false, 'fields' => 'ds_cpf'),
        'RG'                  =>  array('allowEmpty'  => false, 'fields' => 'ds_rg'),
        'E-mail'              =>  array('allowEmpty'  => true,  'fields' => 'ds_email'),
        'Profissão'           =>  array('allowEmpty'  => true,  'fields' => 'ds_profissao'),
        'Nome da Mãe'         =>  array('allowEmpty'  => false, 'fields' => 'ds_mae'),
        'Nome do Pai'         =>  array('allowEmpty'  => false, 'fields' => 'ds_pai'),
        'Nome do Responsável' =>  array('allowEmpty'  => true,  'fields' => 'ds_responsavel'),
    	  'Indicado pelo'       =>  array('allowEmpty'  => true,  'fields' => 'idIndicacao'),
        'Situação'            =>  array('allowEmpty'  => false, 'fields' => 'ds_situacao'),
      
    	);
    	
    	return $objValida->validaFormulario($arrFilters, $arrValidators, $arrOptions);;
    }
    
    /**
     * Salva os Dados Pessoais
     * @param integer Id do Aluno.
     * 
     * @return integer
     */
    public function saveDadosPessoais($intId = null){
    	$objValida = new Core_ValidaFormulario();
      $objDadosInput = $this->validaFormDadosPessoais();
      
      if(!Zend_Validate::is($objDadosInput->ds_nome, 'Alpha', array('allowWhiteSpace' => true)))
        throw new Exception('Nome do aluno possui caracteres inválidos! São permitidos somente caracteres Alfabéticos.', '3');
        
      if(!Zend_Validate::is($objDadosInput->ds_sexo, 'Alpha'))
        throw new Exception('Sexo do Aluno é inválido!', '3');
        
      if(!$objValidate = Zend_Validate::is($objDadosInput->dt_nascimento, 'Date', array('format' => 'dd/MM/YYYY')))
        throw new Exception('Data de Nascimento do Aluno é inválida!', '3');
        
      if(!Zend_Validate::is($objDadosInput->ds_endereco, 'Regex', array('pattern' => '/[A-Za-z0-9]/')))
        throw new Exception('Endereço do aluno possui caracteres inválidos! São permitidos somente caracteres Alfabéticos.', '3');

      if(!Zend_Validate::is($objDadosInput->nr_residencia, 'Alnum', array('allowWhiteSpace' => true)))
        throw new Exception('Número da Residência do aluno possui caracteres inválidos!', '3');
      
      if(!empty($objDadosInput->ds_complemento) && !Zend_Validate::is($objDadosInput->ds_complemento, 'Alnum', array('allowWhiteSpace' => true)))
        throw new Exception('Complemento do endereço do aluno possui caracteres inválidos!', '3');
        
      if(!Zend_Validate::is($objDadosInput->ds_cep, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('CEP deve conter somente numeros!', '3');
      
      if(!Zend_Validate::is($objDadosInput->ds_bairro, 'Regex', array('pattern' => '/[A-Za-z0-9]/')))
        throw new Exception('Bairro do aluno possui caracteres inválidos!', '3');
      
      if(!Zend_Validate::is($objDadosInput->ds_fone, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('Telefone Residêncial deve conter somente numeros!', '3');

      if(!Zend_Validate::is($objDadosInput->ds_cel, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('Telefone Celular deve conter somente numeros!', '3');

      if(!Zend_Validate::is($objDadosInput->ds_cpf, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('CPF do aluno deve conter somente numeros!', '3');
        
      if(!Core_Commons::validaCPF($objDadosInput->ds_cpf))
        throw new Exception('CPF do aluno é inválido!', '3');
      
      $strSqlCPF = $this->select()->where("ds_cpf = ?", $objDadosInput->ds_cpf);
      if($this->fetchAll($strSqlCPF)->current())
        throw new Exception('CPF do aluno deve ser único!', '3');
      
      if(!Zend_Validate::is($objDadosInput->ds_rg, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('RG do aluno deve conter somente numeros!', '3');
        
      $strSqlRG = $this->select()->where("ds_rg = ?", $objDadosInput->ds_rg);
      if($this->fetchAll($strSqlRG)->current())
        throw new Exception('RG do aluno deve ser único!', '3');
        
      if(!Zend_Validate::is($objDadosInput->ds_email, 'EmailAddress'))
        throw new Exception('Email do aluno é inválido!', '3');

      if(!Zend_Validate::is($objDadosInput->ds_mae, 'Alpha', array('allowWhiteSpace' => true)))
        throw new Exception('Nome da mãe do aluno possui caracteres inválidos!', '3');
        
      if(!empty($objDadosInput->ds_pai) && !Zend_Validate::is($objDadosInput->ds_pai, 'Alpha', array('allowWhiteSpace' => true)))
        throw new Exception('Nome do pai do aluno possui caracteres inválidos!', '3');

      if(!empty($objDadosInput->ds_responsavel) && !Zend_Validate::is($objDadosInput->ds_responsavel, 'Alpha', array('allowWhiteSpace' => true)))
        throw new Exception('Nome do responsável pelo aluno possui caracteres inválidos!', '3');
      
      $objModelProfissao = new Application_Model_Profissoes();  
      $arrProfissaoResult = $objModelProfissao->getByNomeIgual($objDadosInput->ds_profissao);
      
      if(!$arrProfissaoResult){
      	$arrNome = explode(" ", $objDadosInput->ds_profissao);
      	if(count($arrNome) > 1)
      		$strSigla = strtoupper(substr($arrNome[0], 0, 2)) . strtoupper(substr(end($arrNome), 0, 3)); 
      	else
          $strSigla = strtoupper(substr($arrNome[0], 0, 5));       	 
      	
      	$arrDadosProfissao['ds_sigla']      =  $strSigla;
        $arrDadosProfissao['ds_profissao']  = $objDadosInput->ds_profissao;
        $arrDadosProfissao['ds_situacao']   = '1';
        $arrDadosProfissao['dt_insercao']   = date("Y-m-d H:i:s");
        
        $intIdProfissao = $objModelProfissao->salvarByArray($arrDadosProfissao);
      }
      else{
        $intIdProfissao = $arrProfissaoResult['idProfissao'];
      }
      
      $arrDados['ds_matricula']   = $objDadosInput->ds_matricula;
      $arrDados['ds_nome']        = $objDadosInput->ds_nome;
      $arrDados['ds_sexo']        = $objDadosInput->ds_sexo;
      $arrDados['idEstadoCivil']  = $objDadosInput->idEstadoCivil;
      $arrDados['dt_nascimento']  = implode('-', array_reverse(explode('/', $objDadosInput->dt_nascimento)));
      $arrDados['ds_endereco']    = $objDadosInput->ds_endereco;
      $arrDados['nr_residencia']  = $objDadosInput->nr_residencia;
      $arrDados['ds_complemento'] = $objDadosInput->ds_complemento;
      $arrDados['ds_cep']         = preg_replace('/[.-]/', '', $objDadosInput->ds_cep);
      $arrDados['ds_bairro']      = $objDadosInput->ds_bairro;
      $arrDados['idCidade']       = $objDadosInput->idCidade;
      $arrDados['ds_fone']        = preg_replace('/[() -]/', '', $objDadosInput->ds_fone);
      $arrDados['ds_cel']         = preg_replace('/[() -]/', '', $objDadosInput->ds_cel);
      $arrDados['ds_cpf']         = preg_replace('/[.-]/', '', $objDadosInput->ds_cpf);
      $arrDados['ds_rg']          = preg_replace('/[.-]/', '', $objDadosInput->ds_rg);
      $arrDados['ds_email']       = $objDadosInput->ds_email;
      $arrDados['idProfissao']    = $intIdProfissao;
      $arrDados['ds_mae']         = $objDadosInput->ds_mae;
      $arrDados['ds_pai']         = $objDadosInput->ds_pai;
      $arrDados['ds_responsavel'] = $objDadosInput->ds_responsavel;
      $arrDados['idIndicacao']    = empty($objDadosInput->idIndicacao) ? '-1' : $objDadosInput->idIndicacao;
      $arrDados['idFuncionario']  = Zend_Auth::getInstance()->getIdentity()->idFuncionario;
      $arrDados['ds_situacao']    = $objDadosInput->ds_situacao;
      
      if($intId == null){
        $arrDados['dt_insercao']    = date('Y-m-d H:i:s');
        $arrDados['dt_atualizacao'] = 'NULL';
        
        //Validando se o numero de matricula é unica.
        $strSqlMatricula = $this->select()->where("ds_matricula = ?", $arrDados['ds_matricula']);
        
        if($this->fetchAll($strSqlMatricula)->current()){
          $arrDados['ds_matricula'] = $arrDados['ds_matricula'] + $arrDados['dt_nascimento'];
        }
        else{
        	$this->insert($arrDados);
          return $this->getAdapter()->lastInsertId($this->_name, 'idAluno');
        }  
      }
      else{
        $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
        $this->update($arrDados, 'idAluno = ' . $intId);
        return $intId;
      }
    }
    
    /**
     * Validação do formulário de Cursos e Turmas
     * 
     * @return object
     */
    public function validaFormCursosTurmas(){
      $objValida = new Core_ValidaFormulario();
      $arrFilters = array('*'  =>  'StringTrim');
      $arrOptions = array('allowEmpty' =>  true);
      
      $arrValidators = array(
        'Curso'   =>  array('allowEmpty'  => false, 'fields' => 'idCurso'),
        'Módulo'  =>  array('allowEmpty'  => false, 'fields' => 'idModulo'),
        'Turma'   =>  array('allowEmpty'  => false, 'fields' => 'idTurma'),
        'Aluno'   =>  array('allowEmpty'  => false, 'fields' => 'idAluno'),
        
      );
      
      return $objValida->validaFormulario($arrFilters, $arrValidators, $arrOptions);;
    }
    
    /**
     *  Salva os dados de cursos e turmas
     *  
     *  @return integer|boolean
     */
    public function saveTurma(){
    	$objDadosInput = $this->validaFormCursosTurmas();
    	
    	if(!Zend_Validate::is($objDadosInput->idCurso, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('Selecione um Curso Válido!', '3');
      
      if(!Zend_Validate::is($objDadosInput->idModulo, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('Selecione um Módulo Válido!', '3');
      
      if(!Zend_Validate::is($objDadosInput->idTurma, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('Selecione uma Turma Válida!', '3');
      
      $arrDados['idTurma']        = $objDadosInput->idTurma;  
      $arrDados['dt_insercao']  = date('Y-m-d H:i:s');
      if($this->update($arrDados, 'idAluno = ' . $objDadosInput->idAluno))
        return $objDadosInput->idAluno;
      
      return false;
    }
    
    /**
     * Validação do formulário de Cursos e Turmas
     * 
     * @return object
     */
    public function validaFormParcelas(){
      $objValida = new Core_ValidaFormulario();
      $arrFilters = array('*'  =>  'StringTrim');
      $arrOptions = array('allowEmpty' =>  true);
      
      $arrValidators = array(
        'Preço'     =>  array('allowEmpty'  => false, 'fields' => 'nr_valor_final'),
        'Aluno'     =>  array('allowEmpty'  => false, 'fields' => 'idAluno'),
        'Módulo'    =>  array('allowEmpty'  => false, 'fields' => 'idModulo'),
        'Parcelas'  =>  array('allowEmpty'  => false, 'fields' => 'ds_parcela'),
      );
      
      return $objValida->validaFormulario($arrFilters, $arrValidators, $arrOptions);;
    }
    
    public function saveContasReceber(){
    	$objDadosInput = $this->validaFormParcelas();
    	$arrDsParcelas = explode('_', $objDadosInput->ds_parcela);
    	
    	$objModelContasReceber = new Application_Model_ContasReceber();
    	
    	$arrDados = array();
    	$intCounterVenc = 0;
    	$boolReturn = false;
    	for($intCounter = 1; $intCounter <= $arrDsParcelas[0]; $intCounter++){
    		if($intCounter > 1)
    		  $intCounterVenc = $intCounterVenc + 30;
    		  
    		$intTimestamp = strtotime("+{$intCounterVenc} days");
        
    		$arrDados['idAluno']        = $objDadosInput->idAluno;  
        $arrDados['idModulo']       = $objDadosInput->idModulo;  
        $arrDados['nr_parcela']     = $intCounter;
        $arrDados['nr_valor']       = $arrDsParcelas[1];
        $arrDados['dt_vencimento']  = date('Y-m-d', $intTimestamp);
        $arrDados['ds_situacao']    = self::IND_ATIVO;
        $arrDados['dt_recebimento'] = null; 
        $arrDados['dt_insercao']    = date('Y-m-d H:i:s');
        
        if($objModelContasReceber->salvarByArray($arrDados))
          $boolReturn = true;
        else
          $boolReturn = false;  
    	}
    	return $boolReturn;
    }
    
    /**
     * Validação do Contrato
     * 
     * @return object
     */
    public function validaFormContrato(){
      $objValida = new Core_ValidaFormulario();
      $arrFilters = array('*'  =>  'StringTrim');
      $arrOptions = array('allowEmpty' =>  true);
      
      $arrValidators = array(
        'Aceite'     =>  array('allowEmpty'  => false, 'fields' => 'st_contrato'),
        'Aluno'     =>  array('allowEmpty'  => false, 'fields' => 'idAluno'),
      );
      
      return $objValida->validaFormulario($arrFilters, $arrValidators, $arrOptions);;
    }
    
    /**
     *  Salva os dados de cursos e turmas
     *  
     *  @return integer|boolean
     */
    public function saveAceite(){
      $objDadosInput = $this->validaFormContrato();
      
      $arrDados['st_contrato']  = $objDadosInput->st_contrato;  
      $arrDados['dt_insercao']  = date('Y-m-d H:i:s');
      if($this->update($arrDados, 'idAluno = ' . $objDadosInput->idAluno))
        return $objDadosInput->idAluno;
      
      return false;
    }
    
    /**
     * Validação do formulário de Edição
     * 
     * @return object
     */
    public function validaFormUpdate(){
      $objValida = new Core_ValidaFormulario();
      $arrFilters = array('*'  =>  'StringTrim');
      $arrOptions = array('allowEmpty' =>  true);
      $arrValidators = array(
        'Id'                  =>  array('allowEmpty'  => false, 'fields' => 'idAluno'),
        'Número de Matrícula' =>  array('allowEmpty'  => false, 'fields' => 'ds_matricula'),
        'Nome'                =>  array('allowEmpty'  => false, 'fields' => 'ds_nome'),
        'Sexo'                =>  array('allowEmpty'  => false, 'fields' => 'ds_sexo'),
        'Estado Civil'        =>  array('allowEmpty'  => false, 'fields' => 'idEstadoCivil'),
        'Data de Nascimento'  =>  array('allowEmpty'  => false, 'fields' => 'dt_nascimento'),
        'Endereço'            =>  array('allowEmpty'  => false, 'fields' => 'ds_endereco'),
        'Número'              =>  array('allowEmpty'  => false, 'fields' => 'nr_residencia'),
        'Complemento'         =>  array('allowEmpty'  => true,  'fields' => 'ds_complemento'),
        'CEP'                 =>  array('allowEmpty'  => false, 'fields' => 'ds_cep'),
        'Bairro'              =>  array('allowEmpty'  => false, 'fields' => 'ds_bairro'),
        'Estado'              =>  array('allowEmpty'  => false, 'fields' => 'idEstado'),
        'Cidade'              =>  array('allowEmpty'  => false, 'fields' => 'idCidade'),
        'Telefone Residêncial'=>  array('allowEmpty'  => true,  'fields' => 'ds_fone'),
        'Telefone Celular'    =>  array('allowEmpty'  => true,  'fields' => 'ds_cel'),
        'CPF'                 =>  array('allowEmpty'  => false, 'fields' => 'ds_cpf'),
        'RG'                  =>  array('allowEmpty'  => false, 'fields' => 'ds_rg'),
        'E-mail'              =>  array('allowEmpty'  => true,  'fields' => 'ds_email'),
        'Profissão'           =>  array('allowEmpty'  => true,  'fields' => 'ds_profissao'),
        'Nome da Mãe'         =>  array('allowEmpty'  => false, 'fields' => 'ds_mae'),
        'Nome do Pai'         =>  array('allowEmpty'  => true, 'fields' => 'ds_pai'),
        'Nome do Responsável' =>  array('allowEmpty'  => true,  'fields' => 'ds_responsavel'),
        'Indicado pelo'       =>  array('allowEmpty'  => true,  'fields' => 'idIndicacao'),
        'Situação'            =>  array('allowEmpty'  => false, 'fields' => 'ds_situacao'),
        
        'Curso'               =>  array('allowEmpty'  => false, 'fields' => 'idCurso'),
        'Modulo'              =>  array('allowEmpty'  => false, 'fields' => 'idModulo'),
        'Turma'               =>  array('allowEmpty'  => false, 'fields' => 'idTurma'),
        
        'Preço'               =>  array('allowEmpty'  => false, 'fields' => 'nr_valor_final'),
        'Parcelas'            =>  array('allowEmpty'  => false, 'fields' => 'ds_parcela'),
        
        'Aceite do contrato'  =>  array('allowEmpty'  => false, 'fields' => 'st_contrato'),
        'Atualização'         =>  array('allowEmpty'  => false, 'fields' => 'dt_atualizacao'),
      );
      
      return $objValida->validaFormulario($arrFilters, $arrValidators, $arrOptions);;
    }
    public function setUpdate($intId){
    	$objDadosInput = $this->validaFormUpdate();
    	
      if(!Zend_Validate::is($objDadosInput->ds_nome, 'Alpha', array('allowWhiteSpace' => true)))
        throw new Exception('Nome do aluno possui caracteres inválidos! São permitidos somente caracteres Alfabéticos.', '3');
        
      if(!Zend_Validate::is($objDadosInput->ds_sexo, 'Alpha'))
        throw new Exception('Sexo do Aluno é inválido!', '3');
        
      if(!$objValidate = Zend_Validate::is($objDadosInput->dt_nascimento, 'Date', array('format' => 'dd/MM/YYYY')))
        throw new Exception('Data de Nascimento do Aluno é inválida!', '3');
        
      if(!Zend_Validate::is($objDadosInput->ds_endereco, 'Regex', array('pattern' => '/[A-Za-z0-9]/')))
        throw new Exception('Endereço do aluno possui caracteres inválidos! São permitidos somente caracteres Alfabéticos.', '3');

      if(!Zend_Validate::is($objDadosInput->nr_residencia, 'Alnum', array('allowWhiteSpace' => true)))
        throw new Exception('Número da Residência do aluno possui caracteres inválidos!', '3');
      
      if(!empty($objDadosInput->ds_complemento) && !Zend_Validate::is($objDadosInput->ds_complemento, 'Alnum', array('allowWhiteSpace' => true)))
        throw new Exception('Complemento do endereço do aluno possui caracteres inválidos!', '3');
        
      if(!Zend_Validate::is($objDadosInput->ds_cep, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('CEP deve conter somente numeros!', '3');
      
      if(!Zend_Validate::is($objDadosInput->ds_bairro, 'Regex', array('pattern' => '/[A-Za-z0-9]/')))
        throw new Exception('Bairro do aluno possui caracteres inválidos!', '3');
      
      if(!Zend_Validate::is($objDadosInput->ds_fone, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('Telefone Residêncial deve conter somente numeros!', '3');

      if(!Zend_Validate::is($objDadosInput->ds_cel, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('Telefone Celular deve conter somente numeros!', '3');

      if(!Zend_Validate::is($objDadosInput->ds_cpf, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('CPF do aluno deve conter somente numeros!', '3');
        
      if(!Core_Commons::validaCPF($objDadosInput->ds_cpf))
        throw new Exception('CPF do aluno é inválido!', '3');
      
      if(!Zend_Validate::is($objDadosInput->ds_rg, 'Regex', array('pattern' => '/[0-9]/')))
        throw new Exception('RG do aluno deve conter somente numeros!', '3');
          
      if(!Zend_Validate::is($objDadosInput->ds_email, 'EmailAddress'))
        throw new Exception('Email do aluno é inválido!', '3');

      if(!Zend_Validate::is($objDadosInput->ds_mae, 'Alpha', array('allowWhiteSpace' => true)))
        throw new Exception('Nome da mãe do aluno possui caracteres inválidos!', '3');
        
      if(!empty($objDadosInput->ds_pai) && !Zend_Validate::is($objDadosInput->ds_pai, 'Alpha', array('allowWhiteSpace' => true)))
        throw new Exception('Nome do pai do aluno possui caracteres inválidos!', '3');

      if(!empty($objDadosInput->ds_responsavel) && !Zend_Validate::is($objDadosInput->ds_responsavel, 'Alpha', array('allowWhiteSpace' => true)))
        throw new Exception('Nome do responsável pelo aluno possui caracteres inválidos!', '3');
      
      $objModelProfissao = new Application_Model_Profissoes();  
      $arrProfissaoResult = $objModelProfissao->getByNomeIgual($objDadosInput->ds_profissao);
      if(!$arrProfissaoResult){
        $arrNome = explode(" ", $objDadosInput->ds_profissao);
        if(count($arrNome) > 1)
          $strSigla = strtoupper(substr($arrNome[0], 0, 2)) . strtoupper(substr(end($arrNome), 0, 3)); 
        else
          $strSigla = strtoupper(substr($arrNome[0], 0, 5));         
        
        $arrDadosProfissao['ds_sigla']      =  $strSigla;
        $arrDadosProfissao['ds_profissao']  = $objDadosInput->ds_profissao;
        $arrDadosProfissao['ds_situacao']   = '1';
        $arrDadosProfissao['dt_insercao']   = date("Y-m-d H:i:s");
        
        $intIdProfissao = $objModelProfissao->salvarByArray($arrDadosProfissao);
      }
      else{
        $intIdProfissao = $arrProfissaoResult['idProfissao'];
      }
      
      $arrDados['ds_nome']        = $objDadosInput->ds_nome;
      $arrDados['ds_sexo']        = $objDadosInput->ds_sexo;
      $arrDados['idEstadoCivil']  = $objDadosInput->idEstadoCivil;
      $arrDados['dt_nascimento']  = implode('-', array_reverse(explode('/', $objDadosInput->dt_nascimento)));
      $arrDados['ds_endereco']    = $objDadosInput->ds_endereco;
      $arrDados['nr_residencia']  = $objDadosInput->nr_residencia;
      $arrDados['ds_complemento'] = $objDadosInput->ds_complemento;
      $arrDados['ds_cep']         = preg_replace('/[.-]/', '', $objDadosInput->ds_cep);
      $arrDados['ds_bairro']      = $objDadosInput->ds_bairro;
      $arrDados['idCidade']       = $objDadosInput->idCidade;
      $arrDados['ds_fone']        = preg_replace('/[() -]/', '', $objDadosInput->ds_fone);
      $arrDados['ds_cel']         = preg_replace('/[() -]/', '', $objDadosInput->ds_cel);
      $arrDados['ds_cpf']         = preg_replace('/[.-]/', '', $objDadosInput->ds_cpf);
      $arrDados['ds_rg']          = preg_replace('/[.-]/', '', $objDadosInput->ds_rg);
      $arrDados['ds_email']       = $objDadosInput->ds_email;
      $arrDados['idProfissao']    = $intIdProfissao;
      $arrDados['ds_mae']         = $objDadosInput->ds_mae;
      $arrDados['ds_pai']         = $objDadosInput->ds_pai;
      $arrDados['ds_responsavel'] = $objDadosInput->ds_responsavel;
      $arrDados['idIndicacao']    = empty($objDadosInput->idIndicacao) ? '-1' : $objDadosInput->idIndicacao;
      $arrDados['idFuncionario']  = Zend_Auth::getInstance()->getIdentity()->idFuncionario;
      $arrDados['ds_situacao']    = $objDadosInput->ds_situacao;
      $arrDados['dt_atualizacao'] = $objDadosInput->dt_atualizacao;
      $arrDados['st_contrato']    = $objDadosInput->st_contrato;
      $arrDados['idTurma'] = $objDadosInput->idTurma;
      
      if($this->update($arrDados, 'idAluno = ' . $intId)){
	      $objModelContasReceber = new Application_Model_ContasReceber();
	      $objModelContasReceber->update(array('ds_situacao' => '0') , 'idAluno = ' . $objDadosInput->idAluno . ' AND ds_situacao = 1');
	      
	      $arrDsParcelas = explode('_', $objDadosInput->ds_parcela);
	      $arrDados = array();
	      $intCounterVenc = 0;
	      $boolReturn = false;
	      for($intCounter = 1; $intCounter <= $arrDsParcelas[0]; $intCounter++){
	        if($intCounter > 1)
	          $intCounterVenc = $intCounterVenc + 30;
	          
	        $intTimestamp = strtotime("+{$intCounterVenc} days");
	        $arrDadosCr['idAluno']        = $objDadosInput->idAluno;  
	        $arrDadosCr['idModulo']       = $objDadosInput->idModulo;  
	        $arrDadosCr['nr_parcela']     = $intCounter;
	        $arrDadosCr['nr_valor']       = $arrDsParcelas[1];
	        $arrDadosCr['dt_vencimento']  = date('Y-m-d', $intTimestamp);
	        $arrDadosCr['ds_situacao']    = self::IND_ATIVO;
	        $arrDadosCr['dt_recebimento'] = null; 
	        $arrDadosCr['dt_insercao']    = date('Y-m-d H:i:s');
	              
	        if($objModelContasReceber->insert($arrDadosCr))
	          $boolReturn = true;
	        else
	          $boolReturn = false;
	      }
	      
	      return $boolReturn;
      }  
    }
    
    /**
     * Exclui um registro  a partir do banco de dados.
     * Um registro nunca será ecluido do banco de dados.
     * Considera-se excluído um registro com status igual a "0".
     * 
     * @param integer  id para a clausula where.
     * @return boolean.
     */
    public function excluir($intId){
      $boolReturn = false;
      
      $strWhereAlunos = "idAluno = '" . $intId . "' AND ds_situacao = 1";
      $strWhereCR = "idAluno = '" . $intId . "' AND ds_situacao = 1";
      
      $arrDados['ds_situacao'] = self::IND_INATIVO; 
      $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');

      $arrDadosCR['ds_situacao'] = self::IND_INATIVO; 
      $arrDadosCR['dt_atualizacao'] = date('Y-m-d H:i:s');
      
      if($this->update($arrDados, $strWhereAlunos))  
        $this->getAdapter()->update('contas_receber', $arrDadosCR, $strWhereCR);
        $boolReturn = true;
      
      return $boolReturn; 
      
    }
  }